// 【十进制转二进制】
// 技巧：要把十进制转换成二进制，我们可以将该十进制除以2并对商取整，直到结果为0。
// 十进制10，转二进制案例
// step1: 10 / 2 => 商5，余数0
// step2: 5 / 2  => 商2，余数1
// step3: 2 / 2  => 商1, 余数0
// step4: 1 / 2  => 商0，余数1
// result：使用栈结构（先进后出），结果为：1010

class Stack {
    constructor () {
      this.count = 0
      this.items = {}
    }
    push (element) {
      this.items[this.count] = element
      this.count++
    }
    size () {
      return this.count
    }
    isEmpty () {
      return this.count === 0
    }
    pop () {
      if (this.isEmpty()) {
        return undefined
      }
      const result = this.items[this.count--]
      delete this.items[this.count]
      return result
    }
    peek () {
      return this.items[this.count - 1]
    }
    clear () {
      this.count = 0
      this.items = {}
    }
    toString () {
      if (this.isEmpty()) {
        return ''
      }
      let result = this.items['0']
      for(let i = 1; i < this.count; i++) {
        result = `${result},${this.items[i]}`
      }
      return result
    }
}

function decimalToBinary (decNumber) {
    const stack = new Stack()
    let number = decNumber  //被除数
    let rem //用于存储每次余数的对象
    let binaryString = ''
    while (number > 0) {
      rem = Math.floor(number % 2)    // 获取余数
      stack.push(rem)

      number = Math.floor(number / 2) // 获取商
    }
    while (!stack.isEmpty()) {
      // binaryString = binaryString + stack.pop().toString()
      binaryString += stack.pop().toString()//拼接
    }
    return binaryString
}

console.log(decimalToBinary(10))    // 1010
console.log(decimalToBinary(233))   // 11101001
console.log(decimalToBinary(1000))  // 1111101000


// 代码分析：当我们将十进制的10转换为二进制时，步骤如下：

// rem = Math.floor(10 % 2)，此时rem结果为0。
// 随后把rem的结果放置在栈中，此时如果使用数组来表示栈的话，结果为[0]。
// 然后number = Math.floor(10 / 2)，此时number结果为5，第一轮循环完毕。
// 第二轮循环开始，rem = Math.floor(5 % 2)，此时rem结果为1。
// 随后把rem的结果放置在栈中，此时如果使用数组来表示栈的话，结果为[0, 1]。
// 然后number = Math.floor(5 / 2)，此时number结果为2，第二轮循环完毕。
// 第三轮循环开始，rem = Math.floor(2 % 2)，此时rem结果为0。
// 随后把rem的结果放置在栈中，此时如果使用数组来表示栈的话，结果为[0, 1, 0]。
// 然后number = Math.floor(2 / 2)，此时number结果为1，第三轮循环完毕。
// 第四轮循环开始，rem = Math.floor(1 % 2)，此时rem结果为1。
// 随后把rem的结果放置在栈中，此时如果使用数组来表示栈的话，结果为[0, 1, 0, 1]。
// 然后number = Math.floor(1 / 2)，此时number结果为0，第四轮循环完毕。
// 0 > 0，循环条件不满足，循环终止。此时栈结构数组表示为[0, 1, 0, 1]。
// 随后根据栈结构后进先出的原则，我们将栈结构拼接在一起，就得到了十进制10转换为二进制后的结果，即：1010。



